{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "本实践使用卷积神经网络（CNN）模型，用于预测手写数字图片。\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/ba26eac845334208851e72c7a2dfef5e1eec566894ba430aba7492e72c49cacd)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "首先导入必要的包\n",
    "\n",
    "numpy---------->python第三方库，用于进行科学计算\n",
    "\n",
    "PIL------------> Python Image Library,python第三方图像处理库\n",
    "\n",
    "matplotlib----->python的绘图库 pyplot:matplotlib的绘图框架\n",
    "\n",
    "os------------->提供了丰富的方法来处理文件和目录\n",
    "torchvision----->提供很多数据集的下载，包括COCO，ImageNet，CIFCAR等\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#导入需要的包\n",
    "import numpy as np\n",
    "import torch \n",
    "from torch import nn\n",
    "from PIL import Image\n",
    "import matplotlib.pyplot as plt\n",
    "import os\n",
    "from torchvision import datasets, transforms,utils"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **Step1：准备数据。**\n",
    "\n",
    "(1)数据集介绍\n",
    "\n",
    "MNIST数据集包含60000个训练集和10000测试数据集。分为图片和标签，图片是28*28的像素矩阵，标签为0~9共10个数字。\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/fc73217ae57f451a89badc801a903bb742e42eabd9434ecc8089efe19a66c076)\n",
    "\n",
    "(2)data_train和data_test\n",
    "root为数据集存放的路径，transform指定数据集导入的时候需要进行的变换，train设置为true表明导入的是训练集合，否则会测试集合。\n",
    "Compose是把多种数据处理的方法集合在一起。使用transforms进行Tensor格式转换和Batch Normalization。\n",
    "参考：\n",
    "https://zhuanlan.zhihu.com/p/37857371\n",
    "https://zhuanlan.zhihu.com/p/30249139\n",
    "（3）打印看下数据是什么样的？数据已经经过transform的归一化处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "class torchvision.transforms.Normalize(mean, std)：\n",
    "给定均值：(R,G,B) 方差：（R，G，B），将会把Tensor正则化。即：Normalized_image=(image-mean)/std.\n",
    "MINIST是（1,28,28）不是RGB的三维，只有一维的灰度图数据，所以不是[0.5,0.5,0.5],而是[0.5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "transform = transforms.Compose([transforms.ToTensor(),\n",
    "                               transforms.Normalize(mean=[0.5],std=[0.5])])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data = datasets.MNIST(root = \"./data/\",\n",
    "                            transform=transform,\n",
    "                            train = True,\n",
    "                            download = True)\n",
    "\n",
    "test_data = datasets.MNIST(root=\"./data/\",\n",
    "                           transform = transform,\n",
    "                           train = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数据下载慢的问题：https://blog.csdn.net/qq_31904559/article/details/96591484?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10000"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(test_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "train_data 的个数：60000个训练样本\n",
    "\n",
    "test_data 的个数：10000个训练样本\n",
    "\n",
    "一个样本的格式为[data,label]，第一个存放数据，第二个存放标签"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "https://pytorch-cn.readthedocs.io/zh/latest/package_references/data/\n",
    "num_workers 表示用多少个子进程加载数据\n",
    "shuffle 表示在装载过程中随机乱序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_loader = torch.utils.data.DataLoader(train_data,batch_size=64,\n",
    "                                          shuffle=True,num_workers=2)\n",
    "test_loader = torch.utils.data.DataLoader(test_data,batch_size=64,\n",
    "                                          shuffle=True,num_workers=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "dataiter = iter(test_loader)\n",
    "images, labels = dataiter.next()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([0, 5, 5, 1, 1, 3, 1, 4, 2, 6, 4, 0, 5, 7, 0, 3, 9, 4, 8, 5, 7, 3, 9, 4,\n",
       "        6, 2, 7, 0, 6, 8, 7, 8, 8, 2, 2, 4, 8, 2, 3, 9, 7, 9, 3, 9, 5, 4, 7, 3,\n",
       "        9, 8, 7, 1, 7, 9, 9, 5, 4, 1, 9, 1, 1, 9, 1, 2])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "labels"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "设置batch_size=64后，加载器中的基本单为是一个batch的数据\n",
    "\n",
    "所以train_loader 的长度是60000/64 = 938 个batch\n",
    "\n",
    "test_loader 的长度是10000/64= 157个batch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "938\n",
      "157\n"
     ]
    }
   ],
   "source": [
    "print(len(train_loader))\n",
    "print(len(test_loader))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "加载到dataloader中后，一个dataloader是一个batch的数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# data_iter = iter(train_loader)\n",
    "# print(next(data_iter))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从二维数组生成一张图片"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD8CAYAAAC4nHJkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAADolJREFUeJzt3X2MXOV1x/HfyXq9jo1JvHVsHOJgxzgBYhqTjgzICFwhXKdCMqgCYkWRQ5M4LzgprStBraq4FancKiF1CUVamq1tifcEiv+gSZAVAVFhy+IQXuLwErMli7e7mA3YEOKX3dM/9m60MTvPrGfuzJ3d8/1I1szcc+/co4Hf3pl55t7H3F0A4nlP0Q0AKAbhB4Ii/EBQhB8IivADQRF+ICjCDwRF+IGgCD8Q1LRG7my6tfkMzWrkLoFQfqu3dcQP20TWrSn8ZrZG0jZJLZL+3d23ptafoVk61y6uZZcAErp894TXrfptv5m1SLpF0qcknSVpnZmdVe3zAWisWj7zr5D0krvvc/cjku6StDaftgDUWy3hP1XSr8Y87s2W/R4z22Bm3WbWfVSHa9gdgDzVEv7xvlR41/nB7t7h7iV3L7WqrYbdAchTLeHvlbRwzOMPSdpfWzsAGqWW8D8haamZLTaz6ZI+LWlXPm0BqLeqh/rc/ZiZbZT0Q40M9XW6+3O5dQagrmoa53f3ByU9mFMvABqIn/cCQRF+ICjCDwRF+IGgCD8QFOEHgiL8QFCEHwiK8ANBEX4gKMIPBEX4gaAIPxAU4QeCIvxAUIQfCIrwA0ERfiAowg8ERfiBoAg/EBThB4Ii/EBQhB8IivADQRF+ICjCDwRF+IGgCD8QVE2z9JpZj6RDkoYkHXP3Uh5NIT82Lf2fuOUDc+u6/+f/elHZ2tDM4eS2py0ZSNZnftWS9f+7aXrZ2p7S3cltDwy9nayfe++mZP30v3o8WW8GNYU/88fufiCH5wHQQLztB4KqNfwu6Udm9qSZbcijIQCNUevb/pXuvt/M5kl6yMx+4e6PjF0h+6OwQZJmaGaNuwOQl5qO/O6+P7sdkHS/pBXjrNPh7iV3L7WqrZbdAchR1eE3s1lmNnv0vqTVkp7NqzEA9VXL2/75ku43s9HnucPdf5BLVwDqrurwu/s+SZ/IsZcpq+XMpcm6t7Um6/sven+y/s555cek29+XHq9+9BPp8e4i/ddvZifr//SdNcl619l3lK29fPSd5LZb+y9J1j/4qCfrkwFDfUBQhB8IivADQRF+ICjCDwRF+IGg8jirL7yhVZ9M1m/afkuy/tHW8qeeTmVHfShZ/7ubP5esT3s7Pdx2/r0by9Zmv3osuW3bgfRQ4MzurmR9MuDIDwRF+IGgCD8QFOEHgiL8QFCEHwiK8ANBMc6fg7bn9yfrT/52YbL+0db+PNvJ1aa+85L1fW+lL/29fcn3ytbeHE6P08//1/9O1utp8p+wWxlHfiAowg8ERfiBoAg/EBThB4Ii/EBQhB8IytwbN6J5srX7uXZxw/bXLAavPj9ZP7gmfXntlqdPStZ/9tWbT7inUTce+MNk/YmL0uP4Q2+8maz7+eWv7t7z9eSmWrzuZ+kV8C5dvlsHfTA9d3mGIz8QFOEHgiL8QFCEHwiK8ANBEX4gKMIPBFVxnN/MOiVdKmnA3Zdly9ol3S1pkaQeSVe6+68r7SzqOH8lLXP/IFkfen0wWX/5jvJj9c9d2JncdsU/fi1Zn3dLcefU48TlPc6/XdLxE6FfL2m3uy+VtDt7DGASqRh+d39E0vGHnrWSdmT3d0i6LOe+ANRZtZ/557t7nyRlt/PyawlAI9T9Gn5mtkHSBkmaoZn13h2ACar2yN9vZgskKbsdKLeiu3e4e8ndS61qq3J3APJWbfh3SVqf3V8v6YF82gHQKBXDb2Z3SnpM0sfMrNfMPi9pq6RLzOxFSZdkjwFMIhU/87v7ujIlBuxzMnTg9Zq2P3pwetXbfvwzP0/WX7u1Jf0Ew0NV7xvF4hd+QFCEHwiK8ANBEX4gKMIPBEX4gaCYonsKOPO6F8rWrj47PSL7H6ftTtYvuuKaZH323Y8n62heHPmBoAg/EBThB4Ii/EBQhB8IivADQRF+ICjG+aeA1DTZr3/lzOS2r+x6J1m//sadyfrfXHl5su4/fV/Z2sJvPJbcVg2cPj4ijvxAUIQfCIrwA0ERfiAowg8ERfiBoAg/EFTFKbrzxBTdzWfwz89P1m+/4ZvJ+uJpM6re98d3bkzWl97Wl6wf29dT9b6nqryn6AYwBRF+ICjCDwRF+IGgCD8QFOEHgiL8QFAVx/nNrFPSpZIG3H1ZtmyLpC9Kei1bbbO7P1hpZ4zzTz6+cnmyfvLW3mT9zo/8sOp9n/HjLyTrH/v78tcxkKShF/dVve/JKu9x/u2S1oyz/Nvuvjz7VzH4AJpLxfC7+yOSBhvQC4AGquUz/0Yze9rMOs1sTm4dAWiIasN/q6QlkpZL6pP0rXIrmtkGM+s2s+6jOlzl7gDkrarwu3u/uw+5+7Ck2yStSKzb4e4ldy+1qq3aPgHkrKrwm9mCMQ8vl/RsPu0AaJSKl+42szslrZI018x6Jd0gaZWZLZfkknokfamOPQKoA87nR01a5s9L1vdfdXrZWtd125LbvqfCG9PPvLw6WX/zgteT9amI8/kBVET4gaAIPxAU4QeCIvxAUIQfCIqhPhTmnt70FN0zbXqy/hs/kqxf+rVryz/3/V3JbScrhvoAVET4gaAIPxAU4QeCIvxAUIQfCIrwA0FVPJ8fsQ1fkL509y+vSE/RvWx5T9lapXH8Sm4ePCdZn/lAd03PP9Vx5AeCIvxAUIQfCIrwA0ERfiAowg8ERfiBoBjnn+KstCxZf+Hr6bH221buSNYvnJE+p74Wh/1osv744OL0Ewz35djN1MORHwiK8ANBEX4gKMIPBEX4gaAIPxAU4QeCqjjOb2YLJe2UdIqkYUkd7r7NzNol3S1pkaQeSVe6+6/r12pc0xaflqz/8uoPlq1tuequ5LZ/dtKBqnrKw+b+UrL+8LbzkvU5O9LX/UfaRI78xyRtcvczJZ0n6RozO0vS9ZJ2u/tSSbuzxwAmiYrhd/c+d9+T3T8kaa+kUyWtlTT6868dki6rV5MA8ndCn/nNbJGkcyR1SZrv7n3SyB8ISfPybg5A/Uw4/GZ2kqTvS7rW3Q+ewHYbzKzbzLqP6nA1PQKogwmF38xaNRL82939vmxxv5ktyOoLJA2Mt627d7h7yd1LrWrLo2cAOagYfjMzSd+VtNfdbxpT2iVpfXZ/vaQH8m8PQL1M5JTelZI+K+kZM3sqW7ZZ0lZJ95jZ5yW9IumK+rQ4+U1b9OFk/c0/WpCsX/UPP0jWv/z++5L1etrUlx6Oe+zfyg/ntW//n+S2c4YZyquniuF3959IKjff98X5tgOgUfiFHxAU4QeCIvxAUIQfCIrwA0ERfiAoLt09QdMWnFK2Ntg5K7ntVxY/nKyvm91fVU952PjqBcn6nlvTU3TP/d6zyXr7IcbqmxVHfiAowg8ERfiBoAg/EBThB4Ii/EBQhB8IKsw4/5E/SV8m+shfDibrm09/sGxt9XvfrqqnvPQPvVO2duGuTcltz/jbXyTr7W+kx+mHk1U0M478QFCEHwiK8ANBEX4gKMIPBEX4gaAIPxBUmHH+nsvSf+deOPveuu37ljeWJOvbHl6drNtQuSunjzjjxpfL1pb2dyW3HUpWMZVx5AeCIvxAUIQfCIrwA0ERfiAowg8ERfiBoMzd0yuYLZS0U9IpGjl9u8Pdt5nZFklflPRatupmdy9/0rukk63dzzVm9Qbqpct366APpn8YkpnIj3yOSdrk7nvMbLakJ83soaz2bXf/ZrWNAihOxfC7e5+kvuz+ITPbK+nUejcGoL5O6DO/mS2SdI6k0d+MbjSzp82s08zmlNlmg5l1m1n3UR2uqVkA+Zlw+M3sJEnfl3Stux+UdKukJZKWa+SdwbfG287dO9y95O6lVrXl0DKAPEwo/GbWqpHg3+7u90mSu/e7+5C7D0u6TdKK+rUJIG8Vw29mJum7kva6+01jli8Ys9rlktLTtQJoKhP5tn+lpM9KesbMnsqWbZa0zsyWS3JJPZK+VJcOAdTFRL7t/4mk8cYNk2P6AJobv/ADgiL8QFCEHwiK8ANBEX4gKMIPBEX4gaAIPxAU4QeCIvxAUIQfCIrwA0ERfiAowg8EVfHS3bnuzOw1Sf87ZtFcSQca1sCJadbemrUvid6qlWdvp7n7ByayYkPD/66dm3W7e6mwBhKatbdm7Uuit2oV1Rtv+4GgCD8QVNHh7yh4/ynN2luz9iXRW7UK6a3Qz/wAilP0kR9AQQoJv5mtMbPnzewlM7u+iB7KMbMeM3vGzJ4ys+6Ce+k0swEze3bMsnYze8jMXsxux50mraDetpjZq9lr95SZ/WlBvS00sx+b2V4ze87M/iJbXuhrl+irkNet4W/7zaxF0guSLpHUK+kJSevc/ecNbaQMM+uRVHL3wseEzexCSW9J2unuy7Jl/yxp0N23Zn8457j7dU3S2xZJbxU9c3M2ocyCsTNLS7pM0udU4GuX6OtKFfC6FXHkXyHpJXff5+5HJN0laW0BfTQ9d39E0uBxi9dK2pHd36GR/3karkxvTcHd+9x9T3b/kKTRmaULfe0SfRWiiPCfKulXYx73qrmm/HZJPzKzJ81sQ9HNjGN+Nm366PTp8wru53gVZ25upONmlm6a166aGa/zVkT4x5v9p5mGHFa6+yclfUrSNdnbW0zMhGZubpRxZpZuCtXOeJ23IsLfK2nhmMcfkrS/gD7G5e77s9sBSfer+WYf7h+dJDW7HSi4n99pppmbx5tZWk3w2jXTjNdFhP8JSUvNbLGZTZf0aUm7CujjXcxsVvZFjMxslqTVar7Zh3dJWp/dXy/pgQJ7+T3NMnNzuZmlVfBr12wzXhfyI59sKONfJLVI6nT3bzS8iXGY2Uc0crSXRiYxvaPI3szsTkmrNHLWV7+kGyT9p6R7JH1Y0iuSrnD3hn/xVqa3VRp56/q7mZtHP2M3uLcLJD0q6RlJw9nizRr5fF3Ya5foa50KeN34hR8QFL/wA4Ii/EBQhB8IivADQRF+ICjCDwRF+IGgCD8Q1P8D6+E2hIAP97kAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "oneimg,label = train_data[0]\n",
    "oneimg = oneimg.numpy().transpose(1,2,0) \n",
    "std = [0.5]\n",
    "mean = [0.5]\n",
    "oneimg = oneimg * std + mean\n",
    "oneimg.resize(28,28)\n",
    "plt.imshow(oneimg)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从三维生成一张黑白图片"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "oneimg,label = train_data[0]\n",
    "grid = utils.make_grid(oneimg)\n",
    "grid = grid.numpy().transpose(1,2,0) \n",
    "std = [0.5]\n",
    "mean = [0.5]\n",
    "grid = grid * std + mean\n",
    "plt.imshow(grid)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "输出一个batch的图片和标签"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor(8) tensor(2) tensor(3) tensor(0) tensor(4) tensor(9) tensor(8) tensor(7) \n",
      "tensor(6) tensor(5) tensor(7) tensor(2) tensor(0) tensor(8) tensor(9) tensor(9) \n",
      "tensor(8) tensor(2) tensor(7) tensor(4) tensor(2) tensor(1) tensor(3) tensor(8) \n",
      "tensor(8) tensor(1) tensor(8) tensor(2) tensor(8) tensor(0) tensor(0) tensor(6) \n",
      "tensor(6) tensor(8) tensor(3) tensor(2) tensor(2) tensor(5) tensor(9) tensor(5) \n",
      "tensor(0) tensor(7) tensor(4) tensor(0) tensor(8) tensor(2) tensor(1) tensor(3) \n",
      "tensor(7) tensor(2) tensor(0) tensor(5) tensor(2) tensor(4) tensor(1) tensor(3) \n",
      "tensor(8) tensor(2) tensor(4) tensor(3) tensor(8) tensor(7) tensor(6) tensor(4) \n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "images, lables = next(iter(train_loader))\n",
    "img = utils.make_grid(images)\n",
    "# transpose 转置函数(x=0,y=1,z=2),新的x是原来的y轴大小，新的y是原来的z轴大小，新的z是原来的x大小\n",
    "#相当于把x=1这个一道最后面去。\n",
    "img = img.numpy().transpose(1,2,0) \n",
    "std = [0.5]\n",
    "mean = [0.5]\n",
    "img = img * std + mean\n",
    "for i in range(64):\n",
    "    print(lables[i], end=\" \")\n",
    "    i += 1\n",
    "    if i%8 is 0:\n",
    "        print(end='\\n')\n",
    "plt.imshow(img)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **Step2.网络配置**\n",
    "网络结构是两个卷积层，3个全连接层。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Conv2d参数\n",
    "- in_channels(int) – 输入信号的通道数目\n",
    "- out_channels(int) – 卷积产生的通道数目\n",
    "- kerner_size(int or tuple) - 卷积核的尺寸\n",
    "- stride(int or tuple, optional) - 卷积步长\n",
    "- padding(int or tuple, optional) - 输入的每一条边补充0的层数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.定义一个CNN网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch.nn.functional as F\n",
    "class CNN(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(CNN,self).__init__()\n",
    "        self.conv1 = nn.Conv2d(1,32,kernel_size=3,stride=1,padding=1)\n",
    "        self.pool = nn.MaxPool2d(2,2)\n",
    "        self.conv2 = nn.Conv2d(32,64,kernel_size=3,stride=1,padding=1)\n",
    "        self.fc1 = nn.Linear(64*7*7,1024)#两个池化，所以是7*7而不是14*14\n",
    "        self.fc2 = nn.Linear(1024,512)\n",
    "        self.fc3 = nn.Linear(512,10)\n",
    "#         self.dp = nn.Dropout(p=0.5)\n",
    "    def forward(self,x):\n",
    "        x = self.pool(F.relu(self.conv1(x)))\n",
    "        x = self.pool(F.relu(self.conv2(x)))\n",
    "             \n",
    "        x = x.view(-1, 64 * 7* 7)#将数据平整为一维的 \n",
    "        x = F.relu(self.fc1(x))\n",
    "#         x = self.fc3(x)\n",
    "#         self.dp(x)\n",
    "        x = F.relu(self.fc2(x))   \n",
    "        x = self.fc3(x)  \n",
    "#         x = F.log_softmax(x,dim=1) NLLLoss()才需要，交叉熵不需要\n",
    "        return x\n",
    "        \n",
    "net = CNN()        "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2.定义损失函数和优化函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch.optim as optim\n",
    "\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)\n",
    "#也可以选择Adam优化方法\n",
    "# optimizer = torch.optim.Adam(net.parameters(),lr=1e-2)   "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **Step3.模型训练**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1,  100] loss :0.042\n",
      "[1,  200] loss :0.044\n",
      "[1,  300] loss :0.043\n",
      "[1,  400] loss :0.046\n",
      "[1,  500] loss :0.043\n",
      "[1,  600] loss :0.050\n",
      "[1,  700] loss :0.039\n",
      "[1,  800] loss :0.041\n",
      "[1,  900] loss :0.042\n",
      "[2,  100] loss :0.046\n",
      "[2,  200] loss :0.043\n",
      "[2,  300] loss :0.038\n",
      "[2,  400] loss :0.042\n",
      "[2,  500] loss :0.044\n",
      "[2,  600] loss :0.043\n",
      "[2,  700] loss :0.035\n",
      "[2,  800] loss :0.034\n",
      "[2,  900] loss :0.037\n",
      "[3,  100] loss :0.037\n",
      "[3,  200] loss :0.044\n",
      "[3,  300] loss :0.037\n",
      "[3,  400] loss :0.029\n",
      "[3,  500] loss :0.038\n",
      "[3,  600] loss :0.034\n",
      "[3,  700] loss :0.037\n",
      "[3,  800] loss :0.038\n",
      "[3,  900] loss :0.041\n",
      "[4,  100] loss :0.032\n",
      "[4,  200] loss :0.026\n",
      "[4,  300] loss :0.039\n",
      "[4,  400] loss :0.035\n",
      "[4,  500] loss :0.035\n",
      "[4,  600] loss :0.034\n",
      "[4,  700] loss :0.039\n",
      "[4,  800] loss :0.036\n",
      "[4,  900] loss :0.034\n",
      "[5,  100] loss :0.031\n",
      "[5,  200] loss :0.030\n",
      "[5,  300] loss :0.031\n",
      "[5,  400] loss :0.027\n",
      "[5,  500] loss :0.036\n",
      "[5,  600] loss :0.042\n",
      "[5,  700] loss :0.034\n",
      "[5,  800] loss :0.031\n",
      "[5,  900] loss :0.032\n",
      "Finished Training\n"
     ]
    }
   ],
   "source": [
    "train_accs = []\n",
    "train_loss = []\n",
    "test_accs = []\n",
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "net = net.to(device)\n",
    "for epoch in range(5):\n",
    "    running_loss = 0.0\n",
    "    for i,data in enumerate(train_loader,0):#0是下标起始位置默认为0\n",
    "        # data 的格式[[inputs, labels]]       \n",
    "#         inputs,labels = data\n",
    "        inputs,labels = data[0].to(device), data[1].to(device)\n",
    "        #初始为0，清除上个batch的梯度信息\n",
    "        optimizer.zero_grad()         \n",
    "        \n",
    "        #前向+后向+优化     \n",
    "        outputs = net(inputs)\n",
    "        loss = criterion(outputs,labels)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        \n",
    "        # loss 的输出，每个一百个batch输出，平均的loss\n",
    "        running_loss += loss.item()\n",
    "        if i%100 == 99:\n",
    "            print('[%d,%5d] loss :%.3f' %\n",
    "                 (epoch+1,i+1,running_loss/100))\n",
    "            running_loss = 0.0\n",
    "        train_loss.append(loss.item())\n",
    "        \n",
    "        # 训练曲线的绘制 一个batch中的准确率\n",
    "        correct = 0\n",
    "        total = 0\n",
    "        _, predicted = torch.max(outputs.data, 1)\n",
    "        total = labels.size(0)# labels 的长度\n",
    "        correct = (predicted == labels).sum().item() # 预测正确的数目\n",
    "        train_accs.append(100*correct/total)\n",
    "        \n",
    "print('Finished Training')            "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "模型的保存"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "PATH = './mnist_net.pth'\n",
    "torch.save(net.state_dict(), PATH)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **Step4.模型评估**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "画图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "def draw_train_process(title,iters,costs,accs,label_cost,lable_acc):\n",
    "    plt.title(title, fontsize=24)\n",
    "    plt.xlabel(\"iter\", fontsize=20)\n",
    "    plt.ylabel(\"acc(\\%)\", fontsize=20)\n",
    "    plt.plot(iters, costs,color='red',label=label_cost) \n",
    "    plt.plot(iters, accs,color='green',label=lable_acc) \n",
    "    plt.legend()\n",
    "    plt.grid()\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "train_iters = range(len(train_accs))\n",
    "draw_train_process('training',train_iters,train_loss,train_accs,'training loss','training acc')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "检验一个batch的分类情况"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GroundTruth:  8 3 7 8 2 2 9 0 5 4 3 9 8 3 9 1 6 1 3 4 9 1 7 8 1 1 9 3 7 9 8 3 8 1 3 0 6 9 6 4 7 0 2 3 7 1 0 0 2 3 5 0 4 8 9 2 9 6 9 0 4 4 3 7\n"
     ]
    }
   ],
   "source": [
    "dataiter = iter(test_loader)\n",
    "images, labels = dataiter.next()\n",
    "\n",
    "# print images\n",
    "test_img = utils.make_grid(images)\n",
    "test_img = test_img.numpy().transpose(1,2,0)\n",
    "std = [0.5,0.5,0.5]\n",
    "mean =  [0.5,0.5,0.5]\n",
    "test_img = test_img*std+0.5\n",
    "plt.imshow(test_img)\n",
    "plt.show()\n",
    "print('GroundTruth: ', ' '.join('%d' % labels[j] for j in range(64)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_net = CNN()\n",
    "test_net.load_state_dict(torch.load(PATH))\n",
    "test_out = test_net(images)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "输出的是每一类的对应概率，所以需要选择max来确定最终输出的类别\n",
    "dim=1 表示选择行的最大索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[-2.9370e+00,  2.9196e+00,  1.4503e+00,  1.9290e+00, -1.7032e+00,\n",
      "         -3.3540e+00, -4.1651e+00,  5.6114e-01,  6.0744e+00,  9.9091e-01],\n",
      "        [-8.2660e-01,  1.9926e-01,  2.1117e+00,  8.7784e+00, -6.1950e+00,\n",
      "          2.3517e+00, -3.8595e+00, -4.4688e+00,  2.6616e+00, -6.8463e-01],\n",
      "        [-1.2551e+00, -2.1900e+00, -2.3137e-01,  3.5690e-01,  3.3703e-01,\n",
      "         -3.7463e+00, -9.9534e+00,  1.1112e+01,  6.5894e-01,  7.0691e+00],\n",
      "        [-4.3811e+00,  6.8432e-01,  1.4182e+00, -3.0549e+00,  3.6184e+00,\n",
      "         -1.0302e+00,  3.6301e+00, -5.6895e+00,  8.5403e+00, -2.8818e+00],\n",
      "        [ 1.7213e+00, -2.5349e+00,  1.2862e+01,  5.4392e+00, -5.6381e+00,\n",
      "         -6.0106e+00, -4.9204e+00,  1.7201e+00,  3.1960e-01, -2.9709e+00],\n",
      "        [ 6.7907e-01, -1.4280e-01,  1.3742e+01,  2.6711e+00, -3.4679e+00,\n",
      "         -6.8306e+00, -4.9212e-01, -1.2316e+00, -1.9436e-02, -4.9522e+00],\n",
      "        [-5.3778e+00, -3.4048e+00, -2.4920e+00, -1.3121e+00,  6.6018e+00,\n",
      "         -3.1535e-02, -5.8609e+00,  2.0678e+00,  2.9574e+00,  9.6402e+00],\n",
      "        [ 1.3431e+01, -9.9947e+00,  1.3931e+00, -3.6735e+00, -6.7095e+00,\n",
      "          5.3610e+00,  2.7952e+00, -5.5493e+00,  1.3846e+00, -1.8000e+00],\n",
      "        [ 2.6048e+00, -6.6721e+00, -8.6037e-02, -2.3346e+00, -2.4672e-01,\n",
      "          7.0542e+00,  1.0276e+00, -4.1918e+00,  2.3851e+00, -3.0068e-02],\n",
      "        [-2.0451e+00, -4.6105e+00, -2.6922e+00, -6.9022e+00,  1.2659e+01,\n",
      "         -3.6460e+00,  4.2669e+00,  3.6011e-01,  1.5312e+00,  2.8810e+00],\n",
      "        [ 2.0302e+00, -1.2782e+00,  1.9532e+00,  7.2313e+00, -6.6916e+00,\n",
      "          2.7369e+00, -4.0242e-02, -1.2492e+00, -2.7507e+00, -3.0859e+00],\n",
      "        [-3.3173e+00, -2.5514e+00, -4.8375e+00, -1.0940e+00,  5.4563e+00,\n",
      "          3.5471e-01, -4.6416e+00,  2.0585e+00,  1.8380e+00,  9.0706e+00],\n",
      "        [ 1.2105e+00, -1.8379e+00,  1.5187e+00,  7.5550e-01, -3.0840e+00,\n",
      "          2.7176e+00,  5.2788e+00, -1.1417e+01,  7.5825e+00, -3.6961e+00],\n",
      "        [-3.0085e+00,  1.6866e+00,  3.2105e+00,  1.1569e+01, -6.4407e+00,\n",
      "          4.0281e+00, -3.6156e+00, -5.0246e+00,  5.8087e-01, -2.9287e+00],\n",
      "        [-1.9585e+00, -3.8801e+00, -2.9540e+00, -1.2593e+00,  3.8636e+00,\n",
      "          2.1274e-01, -5.1274e+00,  1.0685e+00,  3.2660e+00,  8.8714e+00],\n",
      "        [-1.6698e+00,  6.8226e+00, -5.1680e-01, -3.0751e+00,  5.6138e-02,\n",
      "         -7.4970e-01,  2.5025e+00, -3.3441e-01,  3.6472e-01, -2.1126e+00],\n",
      "        [ 1.8211e+00, -4.2700e+00,  4.6824e-01, -6.0528e+00,  4.6969e+00,\n",
      "         -1.5149e+00,  1.2287e+01, -6.3726e+00,  3.9738e-01, -1.9846e+00],\n",
      "        [-5.4096e+00,  7.5988e+00, -7.3101e-01, -2.1346e-01,  1.2362e+00,\n",
      "         -1.7204e-01, -1.0061e+00,  1.3992e+00, -3.3839e-02, -3.5610e-01],\n",
      "        [ 1.6108e+00, -2.8004e+00,  3.6002e+00,  4.8295e+00, -2.3369e+00,\n",
      "          6.3222e-01, -5.3683e-01, -5.5645e+00,  1.7406e+00, -9.8722e-01],\n",
      "        [-4.7611e+00, -3.4831e+00,  1.0044e-01, -9.3177e-01,  1.0747e+01,\n",
      "         -2.6883e+00, -3.7151e+00,  3.2869e+00, -4.6712e-01,  4.4981e+00],\n",
      "        [-4.5707e+00, -2.3767e+00, -3.0437e+00,  1.6505e+00,  3.6163e+00,\n",
      "          1.3272e+00, -6.3305e+00,  3.8600e+00, -3.0655e-02,  7.9921e+00],\n",
      "        [-2.7031e+00,  7.6308e+00,  2.3435e+00, -1.1367e-01,  1.7439e-01,\n",
      "         -2.4108e+00, -1.8221e+00, -9.4778e-02,  2.2998e+00, -3.3625e+00],\n",
      "        [-3.2864e+00,  3.5584e-01,  9.6008e-01,  3.3717e+00, -1.3946e+00,\n",
      "         -1.8268e+00, -1.0718e+01,  1.2455e+01, -1.9355e+00,  4.4380e+00],\n",
      "        [-1.0850e+00, -1.5427e+00, -2.0533e+00,  4.2825e-01, -2.2756e+00,\n",
      "          3.8661e+00, -5.2797e-01, -6.8680e+00,  8.7873e+00,  1.4444e+00],\n",
      "        [-3.6661e+00,  8.2073e+00,  1.0422e-01, -1.1994e+00,  8.8781e-01,\n",
      "         -2.6737e+00, -3.9642e-01,  2.0013e+00, -3.4730e-01, -6.2583e-01],\n",
      "        [-1.2268e+00,  4.4998e+00,  8.3259e-01,  2.0940e-01, -1.2288e+00,\n",
      "         -3.3350e+00, -2.7628e+00,  1.0170e+00,  2.9585e+00,  7.9236e-01],\n",
      "        [-2.1426e+00, -8.4510e+00,  9.2547e-01, -2.5365e+00,  6.1508e+00,\n",
      "         -5.0781e-01, -3.2639e+00, -1.1295e+00,  2.7644e+00,  9.7677e+00],\n",
      "        [-1.1055e+00, -6.5792e-01,  9.9006e-01,  9.6787e+00, -3.7282e+00,\n",
      "          2.2074e+00, -6.2659e+00, -8.5246e-01, -1.1964e+00,  1.9639e+00],\n",
      "        [-3.8970e+00,  1.6801e+00, -1.6077e+00,  3.1537e-01,  1.7122e+00,\n",
      "          3.5638e-01, -5.1933e+00,  4.2649e+00, -1.6684e-01,  4.9524e+00],\n",
      "        [-1.6851e+00, -3.0718e+00, -1.7645e+00,  2.8531e-01,  3.0300e+00,\n",
      "         -8.7741e-01, -6.3533e+00,  6.1591e+00, -1.6781e+00,  8.0783e+00],\n",
      "        [-5.4427e+00,  3.7808e+00,  1.6728e-01, -3.3858e-01,  1.6287e+00,\n",
      "         -9.9073e-01,  1.5673e+00, -4.2376e+00,  6.6543e+00, -1.3860e+00],\n",
      "        [ 1.3078e-01,  8.5120e-01,  2.9213e-01,  6.4606e+00, -6.2350e+00,\n",
      "          3.7882e+00, -3.1660e+00, -8.7732e-01, -1.4094e+00,  4.6801e-01],\n",
      "        [-2.3257e+00, -2.9456e+00,  4.0403e+00,  9.1863e-01, -2.4671e+00,\n",
      "         -2.6697e+00, -3.4457e+00, -1.9129e-01,  1.0360e+01, -1.0675e+00],\n",
      "        [-3.7089e+00,  7.9290e+00, -4.9615e-01, -4.5931e-01,  2.8023e-01,\n",
      "         -3.1497e+00, -1.2683e+00,  1.6708e+00,  1.3058e+00,  1.7090e-01],\n",
      "        [-2.3385e+00, -2.6612e+00, -1.2040e+00,  2.1636e-01, -5.6531e-01,\n",
      "          2.9388e+00, -6.5380e-01, -3.9740e+00,  6.2970e+00,  2.4300e+00],\n",
      "        [ 1.1302e+01, -9.2192e+00,  2.3917e+00, -1.1077e+00, -1.7524e+00,\n",
      "         -1.5189e+00,  1.7732e+00, -1.5764e+00, -1.5591e+00, -3.1972e-01],\n",
      "        [ 6.5888e-01, -3.4560e+00,  2.3644e+00, -6.0642e+00,  4.9008e+00,\n",
      "         -3.4056e-01,  1.0546e+01, -2.7064e+00, -2.1488e+00, -4.1432e+00],\n",
      "        [-5.1215e+00,  7.6795e-01, -4.9708e+00,  4.1239e-01,  4.3151e+00,\n",
      "          2.8176e-01, -7.1780e+00,  5.9470e+00,  9.4290e-01,  7.3434e+00],\n",
      "        [ 3.7255e+00, -3.9574e+00,  1.6710e+00, -6.2963e+00,  2.6115e+00,\n",
      "          3.6072e+00,  1.1972e+01, -9.0629e+00, -1.1825e+00, -3.9430e+00],\n",
      "        [ 3.6752e-03, -8.0811e+00, -1.4997e+00, -7.9878e+00,  1.2135e+01,\n",
      "         -2.1156e+00,  3.2999e+00,  2.5323e+00,  1.0420e+00,  1.4986e+00],\n",
      "        [-6.9893e-01, -8.6541e-01,  3.8695e+00,  2.4078e+00, -3.3072e+00,\n",
      "         -3.6547e+00, -1.0223e+01,  1.1526e+01, -2.9756e-01,  2.8810e+00],\n",
      "        [ 8.8598e+00, -9.0352e+00,  1.1493e+00, -2.5786e+00, -1.3161e+00,\n",
      "          5.7708e-01, -1.0085e+00,  1.1176e+00, -9.7763e-01,  1.9842e+00],\n",
      "        [-2.0144e+00, -1.9725e+00,  6.0144e+00,  7.2420e-01,  3.8481e+00,\n",
      "         -4.0638e+00, -3.6730e+00,  2.9827e+00, -1.1506e+00,  1.6475e+00],\n",
      "        [-1.6933e+00, -9.4283e-01,  4.5866e+00,  7.4167e+00, -3.6735e+00,\n",
      "         -4.5899e-01, -5.2282e-01, -5.1603e+00,  3.4899e+00, -3.0039e+00],\n",
      "        [-4.2778e+00,  6.5729e+00,  1.9145e+00,  2.5585e-01, -1.3833e+00,\n",
      "         -2.1541e+00, -3.8402e+00,  4.9644e+00, -8.1749e-02,  2.6638e-01],\n",
      "        [-4.4780e+00,  8.6576e+00, -5.7412e-01, -1.6952e+00,  1.3385e+00,\n",
      "         -1.7276e+00,  8.0451e-01,  7.2378e-01,  6.9251e-02, -9.4222e-01],\n",
      "        [ 1.2247e+01, -1.0946e+01,  1.9229e+00, -5.0989e+00, -2.5533e+00,\n",
      "          1.3843e+00,  3.8974e+00, -1.4191e+00, -2.2163e+00,  3.2312e-01],\n",
      "        [ 8.1790e+00, -6.6196e+00,  2.3369e+00, -5.5931e+00, -2.1739e+00,\n",
      "          1.7778e+00,  6.8454e+00, -5.7208e+00,  9.8292e-01, -2.6740e+00],\n",
      "        [-1.3560e+00,  3.2344e+00,  9.9258e+00,  3.6715e+00, -6.4647e+00,\n",
      "         -2.6423e+00, -4.5966e+00, -1.5998e-01,  2.3102e+00, -3.3690e+00],\n",
      "        [-1.9686e+00,  1.7577e+00,  1.0685e+00,  8.4828e+00, -6.0577e+00,\n",
      "          1.9120e+00, -2.1326e+00, -1.0178e+00, -2.1498e-01, -1.8851e+00],\n",
      "        [-7.3543e-01, -1.0119e+00, -4.9223e+00,  1.1738e-01,  1.4377e+00,\n",
      "          8.2459e+00,  2.2366e+00, -8.8053e+00,  3.0088e+00,  7.4503e-01],\n",
      "        [ 1.1270e+01, -8.2568e+00,  1.5560e+00, -2.3536e+00, -3.5278e+00,\n",
      "          2.2882e+00,  3.7539e+00, -2.6825e+00, -2.8061e+00, -1.7119e+00],\n",
      "        [-2.8678e-01, -8.3199e+00,  1.0236e+00, -5.3082e+00,  9.2190e+00,\n",
      "         -9.5356e-01,  1.3368e+00,  1.5429e+00,  4.2740e-01,  2.0655e+00],\n",
      "        [ 4.7786e-01, -5.7899e+00,  4.2663e+00, -3.2670e+00, -8.5502e-01,\n",
      "          6.1105e-01,  7.9240e+00, -9.0254e+00,  7.9009e+00, -4.0306e+00],\n",
      "        [-1.5726e+00, -5.2098e+00, -4.2043e+00, -1.0395e+00,  4.0958e+00,\n",
      "         -6.6443e-01, -7.4766e+00,  4.1514e+00,  4.1452e+00,  9.6954e+00],\n",
      "        [-3.9882e-01,  2.4685e+00,  1.1558e+01,  4.2814e+00, -5.9981e+00,\n",
      "         -2.7434e+00, -2.4859e+00, -1.0903e+00, -8.0361e-01, -4.3214e+00],\n",
      "        [-2.6448e+00,  3.8889e+00,  4.8866e-02, -1.9442e+00,  2.4213e+00,\n",
      "         -3.1023e+00, -1.4554e+00, -1.1103e-02,  2.6934e+00,  2.2932e+00],\n",
      "        [ 1.2547e+00, -1.6761e+00, -3.5801e+00, -3.2487e+00,  3.5177e+00,\n",
      "          4.8220e+00,  8.9273e+00, -9.4804e+00,  2.8493e+00, -3.7415e+00],\n",
      "        [ 1.3424e-02, -7.0504e+00, -4.1801e+00, -1.8226e-01,  5.8823e+00,\n",
      "          1.3374e+00, -4.7341e+00,  1.0872e+00,  8.9424e-01,  8.5334e+00],\n",
      "        [ 7.9781e+00, -8.0918e+00,  2.7673e+00, -1.3220e+00, -5.9083e-01,\n",
      "         -8.5912e-02, -2.9959e+00,  2.8627e+00, -2.4510e+00,  1.5700e+00],\n",
      "        [-2.2822e+00, -4.4828e+00, -7.1931e-01, -4.5218e+00,  1.1146e+01,\n",
      "         -3.6134e+00, -1.1649e-01,  1.9060e+00,  1.1930e+00,  3.6062e+00],\n",
      "        [-3.4620e+00, -5.1690e+00, -3.3904e+00, -3.4149e+00,  1.2164e+01,\n",
      "         -9.0408e-01, -1.3849e+00,  3.7302e+00, -2.8863e-01,  3.9342e+00],\n",
      "        [-1.5319e+00, -1.8785e+00,  1.1823e+00,  8.0925e+00, -2.6824e+00,\n",
      "          2.9035e+00, -5.8043e-01, -5.6301e+00,  1.3019e+00, -1.2237e+00],\n",
      "        [ 9.5316e-01, -3.0765e+00,  1.2899e+00, -4.1827e-01,  8.8997e-01,\n",
      "         -3.6959e+00, -7.8579e+00,  1.0887e+01, -2.7248e+00,  5.8833e+00]],\n",
      "       grad_fn=<AddmmBackward>)\n",
      "Predicted:  8 3 7 8 2 2 9 0 5 4 3 9 8 3 9 1 6 1 3 4 9 1 7 8 1 1 9 3 9 9 8 3 8 1 8 0 6 9 6 4 7 0 2 3 1 1 0 0 2 3 5 0 4 6 9 2 1 6 9 0 4 4 3 7\n"
     ]
    }
   ],
   "source": [
    "print(test_out)\n",
    "_, predicted = torch.max(test_out, dim=1)\n",
    "\n",
    "print('Predicted: ', ' '.join('%d' % predicted[j]\n",
    "                              for j in range(64)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "测试集上面整体的准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy of the network on the  test images: 98.810000 %\n"
     ]
    }
   ],
   "source": [
    "correct = 0\n",
    "total = 0\n",
    "with torch.no_grad():# 进行评测的时候网络不更新梯度\n",
    "    for data in test_loader:\n",
    "        images, labels = data\n",
    "        outputs = test_net(images)\n",
    "        _, predicted = torch.max(outputs.data, 1)\n",
    "        total += labels.size(0)# labels 的长度\n",
    "        correct += (predicted == labels).sum().item() # 预测正确的数目\n",
    "print('Accuracy of the network on the  test images: %f %%' % (100. * correct / total))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "10个类别的准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy of 0 : 98.561151 %\n",
      "Accuracy of 1 : 98.369565 %\n",
      "Accuracy of 2 : 98.113208 %\n",
      "Accuracy of 3 : 99.397590 %\n",
      "Accuracy of 4 : 97.333333 %\n",
      "Accuracy of 5 : 100.000000 %\n",
      "Accuracy of 6 : 99.378882 %\n",
      "Accuracy of 7 : 99.319728 %\n",
      "Accuracy of 8 : 96.951220 %\n",
      "Accuracy of 9 : 97.530864 %\n"
     ]
    }
   ],
   "source": [
    "class_correct = list(0. for i in range(10))\n",
    "class_total = list(0. for i in range(10))\n",
    "with torch.no_grad():\n",
    "    for data in test_loader:\n",
    "        images, labels = data\n",
    "        outputs = test_net(images)\n",
    "        _, predicted = torch.max(outputs, 1)\n",
    "        c = (predicted == labels)\n",
    "#         print(predicted == labels)\n",
    "        for i in range(10):\n",
    "            label = labels[i]\n",
    "            class_correct[label] += c[i].item()\n",
    "            class_total[label] += 1\n",
    "\n",
    "\n",
    "for i in range(10):\n",
    "    print('Accuracy of %d : %4f %%' % (\n",
    "        i, 100 * class_correct[i] / class_total[i]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.3.1\n"
     ]
    }
   ],
   "source": [
    "print(torch.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 参考"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "https://aistudio.baidu.com/aistudio/projectdetail/307141\n",
    "\n",
    "https://blog.csdn.net/weixin_45885232/article/details/103950992\n",
    "\n",
    "https://zhuanlan.zhihu.com/p/30249139\n",
    "\n",
    "https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html#sphx-glr-beginner-blitz-cifar10-tutorial-py"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
